package net.sh.dpinfrastructure.support.global;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.google.common.collect.ImmutableList;

/**
 * 
 * 表id生成服务
 * 
 * @version 1.0
 * @since JDK1.7
 * @author Lancer
 * @company 上海朝阳永续信息技术有限公司
 * @copyright (c) 2017 SunTime Co'Ltd Inc. All rights reserved.
 * @date 2017年2月9日 下午7:46:33
 */
public interface DPIDGenerateService {
    
    /**
     * 
     * 获取自增id
     *
     * @param tableName 表名，应该全局唯一
     * @param step 步进，必须大于等于1
     * @return
     * 
     * @author shaohui
     * @date 2016年5月11日 下午1:15:23
     */
    long getIncrementId(String tableName, long step);
    
    /**
     * 
     * 获取自增id，步进为1
     *
     * @param tableName
     * @return
     * 
     * @author shaohui
     * @date 2016年7月1日 下午1:56:28
     */
    long getIncrementId(String tableName);
    
    /**
     * 获取指定个数的一组id，从小到大排列，每个id之间差step<br>
     * e.g：[1, 3, 5, 7]
     * @param tableName
     * @param num
     * @param step 每个id之间相隔个数
     * @return 不可变列表
     * 
     * @author shaohui
     * @date 2017年2月10日 上午10:28:01
     */
    default List<Long> getIncrementIds(String tableName, int count, long step) {
        if (StringUtils.isEmpty(tableName)) {
            throw new IllegalArgumentException("empty tablename");
        }
        if (count < 1) {
            throw new IllegalArgumentException("count is less than 1");
        }
        if (step < 1) {
            throw new IllegalArgumentException("step is less than 1");
        }
        List<Long> ids = new ArrayList<>();
        long lastId = getIncrementId(tableName, count * step);
        for (int i = count - 1; i >= 0; i--) {
            ids.add(lastId - i * step);
        }
        return ImmutableList.<Long>builder().addAll(ids).build();
    }
    
    /**
     * 
     * 获取指定个数的一组id，从小到大排列，每个id之间差step<br>
     * e.g：[1, 2, 3, 4]
     *
     * @param tableName
     * @param count
     * @return 不可变列表
     * 
     * @author shaohui
     * @date 2017年2月10日 上午10:28:45
     */
    default List<Long> getIncrementIds(String tableName, int count) {
        if (StringUtils.isEmpty(tableName)) {
            throw new IllegalArgumentException("empty tablename");
        }
        if (count < 1) {
            throw new IllegalArgumentException("count is less than 1");
        }
        List<Long> ids = new ArrayList<>();
        long lastId = getIncrementId(tableName, count);
        for (int i = count - 1; i >= 0; i--) {
            ids.add(lastId - i);
        }
        return ImmutableList.<Long>builder().addAll(ids).build();
    }
    
}
